import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by aihe on 2017/6/14.
 */
public class Tutorial {
    //在Tutorial 这个类中获取log实例
    private static final transient Logger log = LoggerFactory.getLogger(Tutorial.class);
    public static void main(String[] args) {
        log.info("My First Apache Shiro Application");
        /**
         * 1.获取安全管理器
         * 2.获取用户
         * 3.用户登录验证
         * 4.权限管理
         * 5.角色管理
         * 6.session: 用户登入，用户推出
         */

        //1.获取安全管理器
        //（1） 这里的SecurityManager是org.apache.shiro.mgt.SecurityManager，而不是java.lang.SecurityManager
        // 安全管理器工厂
        // 加载配置文件
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //获取SecurityManager实例
        //（2）解析配置文件，并且返回一些SecurityManger实例
        SecurityManager securityManager = factory.getInstance();
        //2.设置安全管理器
        //设置SecurityManager到静态内存区，单例模式
        SecurityUtils.setSecurityManager(securityManager);

        //3.获取subject对象
        // 安全操作
        Subject currentUser = SecurityUtils.getSubject();
        // 在应用的当前会话中设置属性
        Session session =  currentUser.getSession();
        session.setAttribute("key","鲍康");
        String Value = (String) session.getAttribute("key");
        if(null!=Value){
            log.info("获取session中的值："+Value);
        }

        //当前我们的用户是匿名的用户，我们尝试进行登录，
        //isAuthenticated() 验证当前用户是否登陆过，如果值为false则没有登录
        if (!currentUser.isAuthenticated()){
            //UsernamePasswordToken封装用户名和密码（从.ini文件中获取）
            UsernamePasswordToken token = new UsernamePasswordToken("root", "secret");
            //调用setRememberMe
            //this is all you have to do to support 'remember me' (no config - built in!):
            token.setRememberMe(true);
            //尝试进行登录用户，如果登录失败了，我们进行一些处理
            try{
                currentUser.login(token);
                //当我们获登录用户之后
                log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
                // 查看用户是否有指定的角色
                if ( currentUser.hasRole( "client" ) ) {
                    log.info("Look is in your role" );
                } else {
                    log.info( "没有指定角色" );
                }

                // 查看用户是否有某个权限
                if ( currentUser.isPermitted( "look:desk" ) ) {
                    log.info("You can look.  Use it wisely.");
                } else {
                    log.info("Sorry, you can't look.");
                }

                if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) {
                    log.info("You are permitted to 'drive' the 'winnebago' with license plate (id) 'eagle5'.  " +
                            "Here are the keys - have fun!");
                } else {
                    log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
                }

                //登出
                //退出登录
                currentUser.logout();
                System.exit(0);
            }
            catch ( UnknownAccountException uae ) {
                //账户不存在的操作
                log.info("账户不存在的操作");
            } catch ( IncorrectCredentialsException ice ) {
                //密码不正确
                log.info("密码不正确");
            } catch ( LockedAccountException lae ) {
                //用户被锁定了
                log.info("用户被锁定了");
            } catch ( AuthenticationException ae ) {
                //认证异常
                //无法判断的情形
                log.info("无法判断的情形");
            }

        }


        System.exit(0);
    }
}
